<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>

  // const target = {
  //   name:"target",
  //   age:19,
  //   sex:"男"
  // }

  // const obj = {};

  // Object.defineProperty( obj, "name", {
  //   访问器
  //   get:function(){
  //     console.log("obj的name属性被访问了")
  //     return target.name;
  //   },
  //   控制器
  //   set:function(val){
  //     console.log("obj的name属性被修改成了", val)
  //     target.name = val;
  //   }
  // } )

  // console.log(obj);

  // obj.name;

  // obj.name = "root";

  // console.log(obj.name);
  

  // =======

  // const target = {
  //   name:"target",
  //   age:19,
  //   sex:"男"
  // }

  // const obj = {};

  // for(let i in target){
  //                         // i为遍历到的属性名
  //   Object.defineProperty(obj, i, {
  //     get(){
  //       console.log(`obj的${i}属性被访问了`)
  //       return target[i];
  //     },
  //     set(val){
  //       console.log(`obj的${i}属性被修改成了`, val)
  //       target[i] = val;
  //     }
  //   })
  // }

  // console.log(obj);

  // 可以依照目标对象的所有属性动态绑定访问器和控制器
  // 解决了get和set关键字的问题


  // ==========

  // const obj = {
  //   info: "123"
  // };

  // Object.defineProperty(obj, "msg", {
  //   // 初始值
  //   value: "hello",
  //   // 是否可修改，默认为false
  //   writable: true,
  //   // 是否可枚举，默认为false
  //   enumerable:true
  // });

  // obj.msg = "world";
  // obj.info = "abc";

  // console.log(obj);

  // // 枚举
  // for(let i in obj){
  //   console.log(i, obj[i])
  // }


  // ===========

  // const target = {
  //   msg:"world"
  // }

  // const obj = {};

  // Object.defineProperty(obj, "msg", {
  //   value: "hello",
  //   writable: false,
  //   get(){
  //     return target.msg;
  //   }
  // });

  // console.log(obj)
  // console.log(obj.msg)



</script>
</html>